﻿#ifndef __SS_QUATERNION_H__
#define __SS_QUATERNION_H__
#include <memory.h>
#include "../3dMath/ss3dMathDefine.h"

namespace StarSeeker
{

class ssFLOAT4X : public ssFLOAT4
{
public:
	ssFLOAT4X(void);
	ssFLOAT4X(ssfloat fx, ssfloat fy, ssfloat fz, ssfloat fw);
	ssFLOAT4X(const ssfloat* val);
	ssFLOAT4X(const ssFLOAT4X &sf4);
	void operator=(const ssFLOAT4X &sf4);

	operator ssfloat* ();
	operator const ssfloat* () const;

	void Set(ssfloat fx, ssfloat fy, ssfloat fz, ssfloat fw);
	void Set(const ssfloat *fVal);
	void Zero();
	//设置轴角旋转
	void SetAxisAngle(const ssFLOAT3& axis, ssfloat angle);
	//获取轴角旋转
	void GetAxisAngle(ssFLOAT3& axis, ssfloat& angle);
	//设置欧拉旋转
	void SetEuler(ssfloat ex, ssfloat ey, ssfloat ez);
	//获取欧拉旋转，欧拉旋转情况太多，这个不太准
	void GetEuler(ssfloat& ex, ssfloat& ey, ssfloat& ez);
	//点乘
	ssfloat Dot(const ssFLOAT4X& val) const;
	//叉乘
	ssFLOAT4X Cross(const ssFLOAT4X& val) const;
	//近似0向量
	bool IsZero(ssfloat eps = Math3D::gc_EPSILON_E6);
	//两个向量近似相等
	bool IsApproximate(const ssFLOAT4X& val, ssfloat eps = Math3D::gc_EPSILON_E6);
	//单位四元数
	void Identity();
	//取反
	void Against();
	//求模
	ssfloat Length() const;
	//单位化
	void Normalize();
	//共轭，共轭代表相反的角位移，相当于旋转轴反向。
	ssFLOAT4X Conjugate();
	//逆
	ssFLOAT4X Inverse();

	ssFLOAT4X operator * (ssfloat val) const;
	ssFLOAT4X operator / (ssfloat val) const;
	void operator *= (ssfloat val);
	void operator /= (ssfloat val);
};
typedef ssFLOAT4X ssQuaternion;
typedef ssFLOAT4X ssVector4;
//常量单位四元数
const ssFLOAT4X cg_identityFloat4(0.f, 0.f, 0.f, 1.f);
}

#endif
